/**
 * fn.define = function(id, deps, factory) {
 * }
 *
 * 如果只有一个参数，则赋值给factory
 * 如果有两个参数，第二个赋值给factory，第一个如果是数组则赋值给deps，否则赋值给id
 * 如果有三个参数，则分别赋值
 *
 * id是一个模块的标识字符串，define只有一个参数时，id会被默认赋值为此js文件的绝对路径。
 * 如example.com下的a.js文件中使用define定义模块，则这个模块的ID会赋值为 ./a.js ，
 * 没有特别的必要建议不要传入id。deps一般也不需要传入，需要用到的模块用require加载即可。
 *
 * 工厂函数 factory
 * require：模块加载函数，用于记载依赖模块
 * exports：接口点，将数据或方法定义在其上则将其暴露给外部调用
 * module：模块的元数据,是一个对象，存储了模块的元信息，具体如下：
 *    module.id：模块的ID
 *    module.dependencies：一个数组，存储了此模块依赖的所有模块的ID列表。
 *    module.exports：与exports指向同一个对象
 *
 * 写法1：
 * exports.data2=2; //公有数据
 * exports.fun2=function(){  //共有函数
 *     return 'hello';
 * }
 *
 * 写法2:
 * 也可以直接返回一个对象表示模块
 * return{
 *        data2:2,
 *        fun2:function(){
 *            return 'hello';
 *        }
 *    }
 *
 * 写法3:
 * 如果模块定义没有其他代码，只返回一个对象，还可以有如下简化写法
 * define({
 *    data2:2,
 *    fun2:function(){
 *        return 'hello';
 *    }
 * })
 *
 * 写法1和写法2 同时存在时，不会保留写法1的结果，只会有写法2的结果
 */
define(function (require, exports, module) {
    var m1 = require('m1');
    var m2 = require('m2');

    exports.name = 'main';
    exports.fun1 = function (vv) {
        return 'main.fun1(' + vv + ')';
    };
    exports.m1Fun1 = m1.fun1('main');
    exports.m2Fun1 = m2.fun1('main');
});